package com.zgis.module.bas.util;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.HashMap;
import java.util.Map;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             首次创建
 */

/**
 * 类描述：日期工具类
 */
public class CxDate
{
    // 预定义常用的 DateTimeFormatter
    private static final Map<String, DateTimeFormatter> formatterMap = new HashMap<>();

    static
    {
        formatterMap.put("-", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        formatterMap.put(".", DateTimeFormatter.ofPattern("yyyy.MM.dd"));
        formatterMap.put("/", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }

    /**
     * 将字符串解析为 LocalDate 对象。
     *
     * @param strDatetime 包含日期的字符串，支持的格式为 "yyyy-MM-dd", "yyyy.MM.dd", "yyyy/MM/dd"
     * @return 解析后的 LocalDate 对象
     * @throws Exception 当日期格式不受支持或解析失败时抛出异常
     */
    public static LocalDate parse(String strDatetime) throws Exception
    {
        DateTimeFormatter formatter = getFormatter(strDatetime);
        if (formatter != null)
        {
            try
            {
                return LocalDate.parse(strDatetime, formatter);
            }
            catch (DateTimeParseException e)
            {
                throw new Exception("日期解析错误: " + strDatetime);
            }
        }
        else
        {
            throw new Exception("不支持的日期格式: " + strDatetime);
        }
    }

    /**
     * 将 LocalDate 格式化为字符串，默认格式为 yyyy-MM-dd。
     *
     * @param date 要格式化的 LocalDate 对象
     * @return 格式化后的日期字符串，默认格式为 yyyy-MM-dd
     */
    public static String formatDate(LocalDate date)
    {
        return formatterMap.get("-").format(date); // 默认格式化为 yyyy-MM-dd
    }

    /**
     * 根据日期字符串的分隔符，选择合适的 DateTimeFormatter。
     *
     * @param strDatetime 要解析的日期字符串
     * @return 相应的 DateTimeFormatter，如果找不到匹配的分隔符则返回 null
     */
    private static DateTimeFormatter getFormatter(String strDatetime)
    {
        if (strDatetime.contains("."))
        {
            return formatterMap.get(".");
        }
        else if (strDatetime.contains("-"))
        {
            return formatterMap.get("-");
        }
        else if (strDatetime.contains("/"))
        {
            return formatterMap.get("/");
        }
        return null;
    }

    /**
     * yyyy-MM-dd HH:mm:ss
     *
     * @return 年月日时分秒字符串
     */
    public static String getNowYMDHMSTime()
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = mDateFormat.format(new Date());
        return date;
    }

    /**
     * yyyyMMddHHmmssSSS(主要是用来名称)
     *
     * @return 年月日时分秒字符串
     */
    public static String getNowYMDHMSTimeName()
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String date = mDateFormat.format(new Date());
        return date;
    }

    /**
     * yyyyMM(主要是用来名称)
     *
     * @return 年月日时分秒字符串
     */
    public static String getNowYM()
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyyMM");
        String date = mDateFormat.format(new Date());
        return date;
    }


    /**
     * MM-dd HH:mm:ss
     *
     * @return 年月日时分秒字符串
     */
    public static String getNowMDHMSTime()
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("MM-dd HH:mm:ss");
        String date = mDateFormat.format(new Date());
        return date;
    }

    /**
     * MM-dd
     *
     * @return 年月日时分秒字符串
     */
    public static String getNowYMD()
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String date = mDateFormat.format(new Date());
        return date;
    }

    /**
     * yyyy-MM-dd
     *
     * @param date
     * @return 年月日时分秒字符串
     */
    public static String getYMD(Date date)
    {
        SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dateS = mDateFormat.format(date);
        return dateS;
    }


    /**
     * 获取2个时间段的天使
     *
     * @param startTimeStr 开始时间
     * @param endTimeStr   结束时间
     * @return
     */
    public static int getBetweenDays(String startTimeStr, String endTimeStr)
    {
        int betweenDays = 0;
        Date startTime = strToDateLong(startTimeStr);
        Date endTime = strToDateLong(endTimeStr);

        long start = startTime.getTime();
        long end = endTime.getTime();

        betweenDays = (int) (Math.abs(end - start) / (24 * 3600 * 1000));

        return betweenDays + 1;
    }

    /**
     * 将日期转换成天数
     *
     * @param strDate
     * @return
     */
    public static Date strToDateLong(String strDate)
    {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }
}
